﻿using System;
using System.Threading;
using System.Threading.Tasks;

namespace TaskContinuationOptions枚举
{
    class Program
    {
        static void Main(string[] args)
        {
            /***
             * 主要判断 TaskCreationOptions 什么时候该执行什么时候不该执行
             * 在执行 ContinueWith 的时候，会先判断 source.token 的值，如果是取消了，这几个时候就不会执行了，

             ********/

            CancellationTokenSource source = new CancellationTokenSource();
            source.Cancel();// 
            var task1 = new Task(() => {
                Thread.Sleep(1000);
                Console.WriteLine("task1,tid={0},date={1}",Thread.CurrentThread.ManagedThreadId,DateTime.Now);
                throw new Exception("222222222");

            });
            //var task2 = task1.ContinueWith(x => {
            //    Console.WriteLine("task2,tid={0},date={1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
            //    // 这里默认会预先更加tokne来判断有没有被取消，如果取消就会继续延续task3，因为是预先判断的
            //    // TaskContinuationOptions.LazyCancellation 本质就是就 等task1 执行完了才判断这个token，而不是预先判断
            //}, source.Token, TaskContinuationOptions.LazyCancellation,TaskScheduler.Current);
            //   //希望执行前面那个task的线程也在执行本延续任务， task2 也希望使用，task1的线程去执行，这样可以防止线程切换
            //var task2 = task1.ContinueWith(x => {
            //    Console.WriteLine("task2,tid={0},date={1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now);

            //}, TaskContinuationOptions.ExecuteSynchronously);

            var task2 = task1.ContinueWith(x => {
                Console.WriteLine("task2,tid={0},date={1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
                //OnlyOnRanToCompletion 如果前task异常 就不会执行
                //OnlyOnFaulted  只有前面失败的时候才会执行
            }, TaskContinuationOptions.OnlyOnFaulted);


            var task3 = task2.ContinueWith(x => {
               
                Console.WriteLine("task3,tid={0},date={1}", Thread.CurrentThread.ManagedThreadId, DateTime.Now);
            });

            task1.Start();

            Console.Read();

        }
    }
}
